popover: Track toplevel's focus widget when visible
authorCarlos Garnacho <carlosg@gnome.org>
Thu, 6 Mar 2014 15:58:06 +0000 (16:58 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Thu, 6 Mar 2014 22:23:47 +0000 (23:23 +0100)
If the toplevel focus widget is forced out of the popover (eg. through
gtk_widget_grab_focus() anywhere else), then dismiss the popover.

gtk/gtkpopover.c

index 2286cff8f49ce316cfa7b167de7fe3d0756dfc5a..a5ed37754f4e69ecf5fa487b35fed7bc4f7606fb 100644 (file)
@@ -301,6 +301,19 @@ window_focus_out (GtkWidget  *widget,
   return FALSE;
 }
 
+static void
+window_set_focus (GtkWindow  *window,
+                  GtkWidget  *widget,
+                  GtkPopover *popover)
+{
+  GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
+
+  if (priv->modal &&
+      gtk_widget_is_drawable (GTK_WIDGET (popover)) &&
+      (!widget || !gtk_widget_is_ancestor (widget, GTK_WIDGET (popover))))
+    gtk_widget_hide (GTK_WIDGET (popover));
+}
+
 static void
 gtk_popover_apply_modality (GtkPopover *popover,
                             gboolean    modal)
@@ -322,6 +335,8 @@ gtk_popover_apply_modality (GtkPopover *popover,
                         G_CALLBACK (window_focus_in), popover);
       g_signal_connect (priv->window, "focus-out-event",
                         G_CALLBACK (window_focus_out), popover);
+      g_signal_connect (priv->window, "set-focus",
+                        G_CALLBACK (window_set_focus), popover);
     }
   else
     {